package com.wu.util;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.wu.constant.Constant.CONFIG_SERVER_XML_PATH;
import static com.wu.constant.Constant.CONFIG_WEB_XML_PATH;

/**
 * 封装的工具类
 */
public class TomcatUtil {

    private static final Map<String, String> MAPPING_MAP = new HashMap<>();

    /**
     * 获取文件的后缀名
     *
     * @param url 请求路径
     * @return 文件后缀名
     */
    public static String getFileExtension(String url) {
        if (url == null) {
            return "";
        }
        int index = url.lastIndexOf(".");
        if (index >= 0) {
            index = index + 1;
        }
        // 文件的后缀名
        return index >= 0 ? url.substring(index) : "";
    }

    /**
     * 解析XML文件，获取端口
     *
     * @return
     * @throws Exception
     */
    public static int parseServerXml() throws Exception {
        List<Integer> list = new ArrayList<>();
        Document document = getDocument(CONFIG_SERVER_XML_PATH);
        // 通过Document可以遍历这颗树.并读取相应节点中的内容
        NodeList nl = document.getElementsByTagName("Connector");
        for (int i = 0; i < nl.getLength(); i++) {
            Element node = (Element) nl.item(i);
            list.add(Integer.parseInt(node.getAttribute("port")));
        }
        return list.get(0);
    }

    /**
     * 读取web.xml中的后缀名映射
     *
     * @throws Exception
     */
    public static Map<String, String> parseWebConfig() throws Exception {
        Document document = getDocument(CONFIG_WEB_XML_PATH);
        // 通过Document可以遍历这颗树.并读取相应节点中的内容
        NodeList mappingList = document.getElementsByTagName("mime-mapping");
        for (int i = 0; i < mappingList.getLength(); i++) {
            //遍历每一个节点
            Node mimeMapping = mappingList.item(i);
            NodeList childNodes = mimeMapping.getChildNodes();
            MAPPING_MAP.put(childNodes.item(1).getFirstChild().getNodeValue(), childNodes.item(3).getFirstChild().getNodeValue());
        }
        return MAPPING_MAP;
    }

    /**
     * 读取Session过期时间 (分钟)
     */
    public static int getSessionOverdueTime() throws Exception {
        Document document = getDocument(CONFIG_WEB_XML_PATH);
        // 通过Document可以遍历这颗树.并读取相应节点中的内容
        NodeList mappingList = document.getElementsByTagName("session-config");
        for (int i = 0; i < mappingList.getLength(); i++) {
            Node mimeMapping = mappingList.item(i);
            NodeList childNodes = mimeMapping.getChildNodes();
            return Integer.parseInt(childNodes.item(1).getFirstChild().getNodeValue());
        }
        return 0;
    }

    /**
     * 读取Cookie过期时间 (秒)
     */
    public static int getCookieOverdueTime() {
        Document document = null;
        try {
            document = getDocument(CONFIG_WEB_XML_PATH);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 通过Document可以遍历这颗树.并读取相应节点中的内容
        assert document != null;
        NodeList mappingList = document.getElementsByTagName("cookie-config");
        for (int i = 0; i < mappingList.getLength(); i++) {
            Node mimeMapping = mappingList.item(i);
            NodeList childNodes = mimeMapping.getChildNodes();
            return Integer.parseInt(childNodes.item(1).getFirstChild().getNodeValue());
        }
        return 0;
    }

    private static Document getDocument(String path) throws Exception {
        // 通过DocumentBuilderFactory创建XML解释器
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 通过解释器创建一个可以加载并生成XML的DocumentBuilder
        DocumentBuilder documentBuilder = factory.newDocumentBuilder();
        // 通过DocumentBuilder加载并生成一颗XML树.Document对象的实例
        return documentBuilder.parse(path);
    }
}
